package cn.yhp.mybatis;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Map;

/**
 * @author yhp
 * @description 映射器代理类
 * @date 2023/11/5
 */
public class MapperProxy<T> implements InvocationHandler {

    /**
     * 模拟数据库会话对象.可以理解为所有的数据库语句操作，都是通过接口名称+方法名称作为key，操作作为逻辑的方式进行使用的
     */
    private Map<String,String> sqlSession;

    /**
     * 需要代理的mapper接口
     */
    private Class<T> mapperInterface;

    public MapperProxy(Map<String,String> sqlSession,Class<T> mapperInterface){
        this.sqlSession=sqlSession;
        this.mapperInterface=mapperInterface;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 如果方法所在类是Object，如toString，hashCode方法，就不代理了，正常调用
        if (Object.class.equals(method.getDeclaringClass())){
            return method.invoke(proxy,args);
        }else {
            // 代理逻辑，暂时返回字符串
            return "此方法被代理了"+sqlSession.get(mapperInterface.getName()+"."+method.getName());
        }
    }
}
